package com.atguigu.gmall.product.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.atguigu.gmall.model.product.BaseCategoryView;
import com.atguigu.gmall.product.mapper.BaseCategoryViewMapper;
import com.atguigu.gmall.product.service.BaseCategoryViewService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/***
 * 分类视图表service层实现类
 */
@Service
public class BaseCategoryViewServiceImpl implements BaseCategoryViewService {

    @Autowired
    private BaseCategoryViewMapper baseCategoryViewMapper;

    /**
     * 获取首页所有的分类（一级、二级、三级），做好映射
     *
     * @return
     */
    @Override
    public List<JSONObject> listIndexCategory() {
        //1 先查出表中所有的数据
        List<BaseCategoryView> baseCategoryViewList = baseCategoryViewMapper.selectList(null);

        //2 将全部数据以一级分类进行分桶
        Map<Long, List<BaseCategoryView>> category1Map =
                baseCategoryViewList.stream().collect(Collectors.groupingBy(BaseCategoryView::getCategory1Id));

        //3 遍历以一级分类id分出来的桶数据
        List<JSONObject> json1ObjectList = category1Map.entrySet().stream().map(category1Entry -> {
            //获取key：一级分类的id
            Long category1Id = category1Entry.getKey();
            //获取value：每一个一级对应的二、三级分类的数据list
            List<BaseCategoryView> baseCategory1ViewList = category1Entry.getValue();
            //一级分类的名字
            String category1Name = baseCategory1ViewList.get(0).getCategory1Name();

            //3.1 把“每一个一级对应的二、三级分类的数据list”以二级分类id进行分桶
            Map<Long, List<BaseCategoryView>> category2Map =
                    baseCategory1ViewList.stream().collect(Collectors.groupingBy(BaseCategoryView::getCategory2Id));

            //3.2 遍历以二级分类id分出来的桶的数据
            List<JSONObject> json2ObjectList = category2Map.entrySet().stream().map(category2Entry -> {
                //获取key：二级分类id
                Long category2Id = category2Entry.getKey();
                //获取value：每个二分类对应的三级分类数据的list
                List<BaseCategoryView> baseCategory2ViewList = category2Entry.getValue();
                //获取二级分类的名字
                String category2Name = baseCategory2ViewList.get(0).getCategory2Name();

                //3.2.1 遍历每个二级分类所对应的三级分类数据的list，得到一个
                List<JSONObject> json3ObjectList = baseCategory2ViewList.stream().map(baseCategory3View -> {
                    //获取三级分类id
                    Long category3Id = baseCategory3View.getCategory3Id();
                    //获取三级分类的名字
                    String category3Name = baseCategory3View.getCategory3Name();
                    //将数据进行封装
                    JSONObject json3Object = new JSONObject();
                    json3Object.put("categoryId", category3Id);
                    json3Object.put("categoryName", category3Name);
                    return json3Object;
                }).collect(Collectors.toList());

                //3.2.2 封装数据，把二级分类id、二级分类名字、二级分类id对应的三级分类数据的list，封装为一个map
                JSONObject json2Object = new JSONObject();
                json2Object.put("categoryId", category2Id);
                json2Object.put("categoryName", category2Name);
                json2Object.put("childCategory", json3ObjectList);

                //3.2.3 返回数据
                return json2Object;
            }).collect(Collectors.toList());

            //3.3 封装数据，把一级分类id、一级分类名字、一级分类id对应的二级分类数据的list，封装为一个map
            JSONObject json1Object = new JSONObject();
            json1Object.put("categoryId", category1Id);
            json1Object.put("categoryName", category1Name);
            json1Object.put("childCategory", json2ObjectList);

            //3.4 返回数据
            return json1Object;
        }).collect(Collectors.toList());

        //4 将封装好的一级、二级、三级map返回
        return json1ObjectList;
    }

    /**
     * 根据category3Id查询一、二、三分类数据
     *
     * @param category3Id
     * @return
     */
    @Override
    public BaseCategoryView listCategoryByCategory3Id(Long category3Id) {
        return baseCategoryViewMapper.selectById(category3Id);
    }
}
